import requests
from typing import List, Dict, Optional, Any
import logging
from datetime import datetime, timedelta
# 关键：从 config.setting 导入 zxy_get 的配置（而非硬编码）
# 注：导入路径需根据项目实际目录结构调整，若 utils 目录在 app 下，需用相对路径
from config.setting import ZXY_API_BASE_URL, ZXY_API_SECRET

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)
logger = logging.getLogger(__name__)


class SimpleNotesFetcher:
    """简化版达人笔记获取器 - 只获取最近5篇笔记"""

    def __init__(self, base_url: Optional[str] = None, secret: Optional[str] = None):
        """
        初始化工具（优先使用传入的配置，无传入则用 setting 中的默认配置）
        :param base_url: API基础地址（可选，默认用 ZXY_API_BASE_URL）
        :param secret: 认证secret（可选，默认用 ZXY_API_SECRET）
        """
        # 优先级：传入的参数 > setting 中的配置（确保灵活性）
        self.base_url = base_url.rstrip("/") if base_url else ZXY_API_BASE_URL.rstrip("/")
        self.secret = secret if secret else ZXY_API_SECRET
        self.session = requests.Session()

        # 校验配置（避免空值导致调用失败）
        if not self.base_url:
            raise ValueError("zxy_get API基础地址未配置（请检查.env和setting.py）")
        if not self.secret:
            raise ValueError("zxy_get 认证密钥未配置（请检查.env和setting.py）")

        # 配置请求头
        self.headers = {
            "Content-Type": "application/json; charset=utf-8",
            "secret": self.secret
        }

    def fetch_recent_5_notes(self, user_uuid: str, days: int = 180) -> Dict[str, Any]:
        """
        获取达人最近5篇笔记的完整内容（含文字+图片）
        :param user_uuid: 达人唯一标识（如 6549e5640000000004008716）
        :param days: 查询最近多少天，默认为180天
        :return: 包含笔记文字内容、图片URL的结果
        """
        try:
            # 计算时间范围
            end_time = datetime.now()
            start_time = end_time - timedelta(days=days)
            time_format = "%Y-%m-%d %H:%M:%S"

            # 准备请求参数
            request_body = {
                "userUuid": user_uuid,
                "size": 5,  # 固定获取最近5篇
                "publicTimeStart": start_time.strftime(time_format),
                "publicTimeEnd": end_time.strftime(time_format)
            }

            api_path = "/platform/agent/homepage/listNoteByUserUuid"
            request_url = f"{self.base_url}{api_path}"

            logger.info(f"开始请求达人笔记：user_uuid={user_uuid}，时间范围={start_time.strftime(time_format)}~{end_time.strftime(time_format)}")

            # 发送POST请求
            response = self.session.post(
                url=request_url,
                headers=self.headers,
                json=request_body,
                timeout=15
            )
            response.raise_for_status()  # 捕获HTTP错误（如404、500）

            # 解析响应
            response_json = response.json()
            api_code = response_json.get("code", "")

            if api_code != "200":
                error_msg = response_json.get("msg", "API业务错误（非200状态码）")
                logger.error(f"达人笔记请求失败：{error_msg}（code={api_code}）")
                return {
                    "status": "error",
                    "code": api_code,
                    "msg": error_msg,
                    "data": None
                }

            # 提取笔记数据（含文字+图片）
            raw_notes = response_json.get("data", [])
            logger.info(f"成功获取 {len(raw_notes)} 篇达人笔记")

            # 整理结果：确保返回文字内容（title/description）和图片URL（imagesList）
            formatted_notes = []
            for note in raw_notes:
                formatted_notes.append({
                    "note_id": note.get("id", "N/A"),  # 笔记ID
                    "publish_time": note.get("publicTime", "N/A"),  # 发布时间
                    "title": note.get("title", ""),  # 笔记标题（文字内容）
                    "description": note.get("description", ""),  # 笔记正文（文字内容）
                    "image_urls": note.get("imagesList", "").split(",") if note.get("imagesList") else [],  # 图片URL列表
                    "interaction": {  # 互动数据（可选，用于辅助风格分析）
                        "like_count": note.get("likedCount", 0),
                        "comment_count": note.get("commentsCount", 0),
                        "collect_count": note.get("collectedCount", 0)
                    }
                })

            return {
                "status": "success",
                "code": "200",
                "msg": "达人笔记获取成功",
                "data": {
                    "user_uuid": user_uuid,
                    "note_count": len(formatted_notes),
                    "notes": formatted_notes,  # 整理后的笔记（含文字+图片）
                    "raw_response": response_json  # 保留原始响应（用于调试）
                }
            }

        except requests.exceptions.HTTPError as e:
            error_detail = e.response.text if e.response else str(e)
            logger.error(f"HTTP请求错误：{error_detail}")
            return {"status": "error", "code": "HTTP_ERROR", "msg": f"HTTP错误：{str(e)}", "data": None}
        except Exception as e:
            logger.error(f"未知错误：{str(e)}", exc_info=True)
            return {"status": "error", "code": "UNKNOWN_ERROR", "msg": f"未知错误：{str(e)}", "data": None}


def display_notes_complete(notes_data: Dict):
    """辅助函数：打印笔记详情（文字+图片URL）"""
    if not notes_data or notes_data["status"] != "success":
        print(f"笔记数据获取失败：{notes_data.get('msg', '未知错误')}")
        return

    data = notes_data["data"]
    print(f"\n=== 达人 {data['user_uuid']} 最近 {data['note_count']} 篇笔记详情 ===")
    for idx, note in enumerate(data["notes"], 1):
        print(f"\n【第{idx}篇】")
        print(f"笔记ID：{note['note_id']}")
        print(f"发布时间：{note['publish_time']}")
        print(f"标题：{note['title']}")
        print(f"正文：{note['description'][:200]}..." if len(note['description']) > 200 else f"正文：{note['description']}")
        print(f"图片数量：{len(note['image_urls'])}")
        if note['image_urls']:
            print(f"图片URL列表：{note['image_urls']}")
        print(f"互动数据：点赞{note['interaction']['like_count']} | 评论{note['interaction']['comment_count']} | 收藏{note['interaction']['collect_count']}")
        print("-" * 80)


# 测试用（执行脚本时运行，实际项目中可注释）
if __name__ == "__main__":
    # 测试参数（仅用于本地调试，无需硬编码敏感信息）
    TEST_USER_UUID = "6549e5640000000004008716"  # 测试用达人UUID（非敏感，可保留）

    try:
        # 初始化获取器（无需传base_url和secret，自动从setting读取）
        fetcher = SimpleNotesFetcher()
        # 获取笔记
        result = fetcher.fetch_recent_5_notes(user_uuid=TEST_USER_UUID, days=180)
        # 打印详情
        display_notes_complete(result)
    except Exception as e:
        print(f"测试失败：{str(e)}")
